"""
@author: xxw
@file: 01.socket网络编程.py
@time: 2023/6/20 14:37
"""
# 客户端、服务器架构
# C/S   (Client Server) 架构
# B/S   (Browser Server) 架构

# 网络
# tcp/ip五层模型
# 应用层 http协议 ssh协议
# 传输层 tcp协议 udp协议
# 网络层 ip协议 icmp协议
# 数据链路层
# 物理层


# socket抽象层     它是tcp/ip网络环境下引用程序与底层通信驱动程序之间运行开发的接口，使应用程序不需要了解底层的具体实现就能实现数据传输

# socket是一种 “打开 --读/写--关闭”模式的实现
# 客户端和服务端都会各自维护一个”文件“，可以向各自文件写入内容供对方读取，通讯结束就关闭文件

# 创建socket


# Linux下主要有以下五种I/O模型：
# 1.阻塞I/O（blocking IO）
# 2.非阻塞I/O (nonblocking I/O)
# 3.多路复用IO（multiplexing IO）
# 4.信号驱动I/O (signal driven I/O (SIGIO))
# 5.异步I/O (asynchronous I/O)

# cpu两种状态：用户态、内核态
# 用户态：运行用户程序
# 内核态：运行操作系统的程序

# 内存：用户空间、内核空间

# 同步与异步
# 首先来解释同步和异步的概念，这两个概念与消息的通知机制有关。也就是同步与异步主要是从消息通知机制角度来说的。
# 同步就是一个任务的完成需要依赖另外一个任务时，只有等待被依赖的任务完成后，依赖的任务才能算完成，这是一种可靠的任务序列。要么成功都成功，失败都失败，两个任务的状态可以保持一致。
# 异步是不需要等待被依赖的任务完成，只是通知被依赖的任务要完成什么工作，依赖的任务也立即执行，只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成，依赖它的任务无法确定，所以它是不可靠的任务序列。

# 阻塞与非阻塞
# 阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。
# 阻塞调用是指调用结果返回之前，当前线程会被挂起，一直处于等待消息通知，不能够执行其他业务。函数只有在得到结果之后才会返回。
# 非阻塞和阻塞是反过来的，指在不能立刻得到结果之前，该函数不会阻塞当前线程，而会立刻返回。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率，但是也带了另外一种后果就是系统的线程切换增加。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估。


# 同步、异步
    #关注的是消息的通信机制
    #同步 --》事情一件一件做，主动请求等待  完成之后，再进行下一步
    #异步 --》被动，不需要主动获取   完成了会收到通知
# 阻塞、非阻塞
    #关注程序在等待调用结果时的状态

# 数据读取的两个阶段：
# 1、用户进程进行系统调用，发起io操作，由用户空间转为内核空间，等待数据到达
# 2、将数据拷贝到用户空间，程序获取到数据

# io多路复用：一个进程能同时处理多个io请求(减少创建多个线程或进程同步执行io的开销)
